记 OC 转swift3.0 邂逅感

#起因
虽然 swift 出到现在已经有很长一段时间了,还记得最初发布的时候那时候正在流行Flappy Bird这款游戏,我也有下载去玩,那时候记得新语言刚刚放出没多久就有大神用新语言翻了一遍这个游戏,可以看出有代码基础的前提下来开发是完全没啥问题的,那时候只是觉得有趣,但是知道想普及没个几年时间是不行的,那时候也有很多这种言论,而且语法一直在发生改变,每次改变语法都会让之前的代码需要重新修改,跟 OC 这种一沉不变的语言果然是不一样的,所以那时候我也没想去学习,在swift 出3.0后我也只是微微表示下关注而已,并没有想学习的意愿,感觉后面还是 会有4.0,5.0等等..只不过在项目需要用到 chart 这个第三方图表框架,由于这个框架是从安卓那边几乎复制过来, 用 swift 语言编译,API 的相似程度官方都已经说有90多,所以官方连文档也懒得重新写,直接说看安卓的文档就行,我也是因为这样才慢慢去学习swift, 但因为只是改改源代码,所以就么有系统的学习,只是大概了解,所以对于这个语言也是一知半解,等到项目完成后有时间才重新认识下这门新语言.

#OC 转 swift 会不会很难?
老实说吧,如果你什么语言都不会只会 OC 的话,直接看 swift 是有些晕的,别说你会点 C 基础,没什么用,毕竟只是基础,估计都忘光了.
学习这个语言有两个方向,我自己总结是这样的.

  • 直接学习 swift 语言,系统的学习一遍 swift
  • 以 iOS 为标准去学习 swift
    这两者有什么区别,区别还是有的, 前者需要大量的时间去系统的学习,耗时较久,但是效果杠杠的,充分了解这门语言,可以用于非 iOS 开发.
    后者其实就是完全为了 iOS 开发而学习这门语言,这种学习方式可以说是一边编程 iOS 一边学习,用到哪些知识的时候再去了解,当然前期的知识肯定是要先了解才能下手的,但这种方式弊端也是很明显,容易走弯路,只能说对于想速成或者说对自己有信息的小伙伴才选择这种方式.

#举个栗子说下吧
以 iOS 为前提,swift 对于 oc 的区别有什么,我大概说下吧,肯定是不全面,但是也是我自己觉得比较重要的.

  • 属性
    比如是ViewController页面,属性写在ViewController这个大括号里面

属性

  • 懒加载
    swift的懒加载就是在属性前面加 lazy 关键字,在大括号内相当于新建另一个最后在 return 给懒加载的属性

懒加载

  • 宏定义define
    在 swift 中已经不能使用 #define来宏定义了,所以在界面头部定义可以这样写,但是由于swift 中已经不需要像 oc 一样声明某个头文件,所以如果按照我这样写,其实在其他文件都是可以访问的,相当于你的定义是写在 oc 中的全局文件中.

define

  • 设置代理
    在 oc 中,我们设置代理后都是在@interface的类括号后面<>里面去实现,但是 swift 中不是,而是在 class 后面的集成类中直接继承你的代理或者数据源,前面的截图也是这样的.
  • oc 混编到 swift
    我们很多第三方库是 oc 语言的,但是这并不妨碍我们去使用, swift 也可以直接引用 oc 中的库,使用 cocoapod 可以很容易的集成.集成后需要新建一个桥接文件,如果觉得麻烦,可以直接在项目新建一个类,但是这个类是 objectc 的类,点击创建后会问你要不要自动建立桥接文件,点击 create 后就自动新建了桥接文件并且配置好,不需要繁琐的步骤,然后就可以把刚才新建的oc 类删掉了.
  • oc 在 swift 中的声明
    在桥接文件# import 你要用到的类,这样你每个类都可以使用了,只不过不会有代码提示,需要自己一个个的敲,但是如果编译不过还是会提示的.

oc 桥接

  • oc 在 swift 中的使用
    你对 swift 有一定的了解后去用的话,就会觉得其实没多大区别,我举个例子

OC
swift

  • swift 的方法
    swift 中方法以 func 开头,默认是公有方法,如果想变成私有方法,在 func 前面加private关键字,但其实我经常使用的也只是 func 创建方法,如果有返回值,跟 oc 不一样, oc 是写在括号里面,但是 swift 方法前面没有括号,所以是这样写.

swift 的方法
大致意思是这样的,test 是方法名称,名称后面的括号是入参属性,由于没有入参属性所以就只有括号,->后面代表的就是返回值类型,如果你创建一个没有参数没有返回值的,可以直接写 func test(){}这样就可以了,当然括号还是必须的,返回值没有可以省略,可以有多个参数,多个返回值,只要在返回值后面加个逗号就可以继续写,当然需要有个括号包裹起来才可以,如图

多返回值

  • 点语法
    swift 中没有了 oc 中的那种空格调用语法,比方说[app delegate]这样的写法, swift 中以点语法为主,最简单的例子:

    //swift
    UIApplication.shared.isNetworkActivityIndicatorVisible = true
    //oc
    [UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
    

    基本上 swift 都是点语法,熟悉后会发现这类语法很常见.

  • swift 中的 block
    swift 中也有 block 这种概念,可以多参数,具体还是看图

对block 的声明

调用这个 block,但是不执行,等代码块的时候再执行

在其他页面执行,跟 oc 一样在代码块里面执行,少了^号

在方法中参数里面的 block

调用这个方法

  • 一些其他的东西

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    // 旋转动画
    let anim = CABasicAnimation(keyPath: "transform.rotation")
    anim.toValue = M_PI*2//旋转一圈
    anim.duration = 0.8//旋转时间
    anim.repeatCount = MAXFLOAT//旋转圈数
    anim.isRemovedOnCompletion = true
    refreshBtn.imageView?.layer.add(anim, forKey: nil)//添加动画
    //GDC 延迟执行
    DispatchQueue.global().asyncAfter(deadline: .now()+2.0) {
    OperationQueue.main.addOperation {
    //停止旋转,记得要在主线程执行
    self.refreshBtn.imageView?.layer.removeAllAnimations()
    }
    }
  • 还有很多东西,但是一时也想不起来,未完待续吧,看有什么就补充下.